Common Socket Options হলো Socket-এর বিভিন্ন বৈশিষ্ট্য, যা setsockopt()
এবং getsockopt()
ফাংশন ব্যবহার করে কনফিগার করা যায়। এগুলো Socket-এর আচরণ কাস্টমাইজ করতে এবং নেটওয়ার্ক অ্যাপ্লিকেশনগুলোর কর্মক্ষমতা এবং স্থায়িত্ব নিশ্চিত করতে সহায়ক। এখানে SO_REUSEADDR
, SO_KEEPALIVE
, এবং SO_LINGER
এই তিনটি গুরুত্বপূর্ণ অপশন নিয়ে আলোচনা করা হলো।
SO_REUSEADDR
SO_REUSEADDR
অপশন Socket-কে পুনরায় ব্যবহার করতে দেয়, বিশেষত যখন একটি Socket দ্রুত নতুনভাবে Binding করতে হয়। এটি সাধারণত সার্ভার প্রোগ্রামিংয়ে ব্যবহৃত হয়, যেখানে পূর্ববর্তী সংযোগ থেকে Address বা Port ব্যস্ত থাকলে এটি মুক্ত করে নতুন সংযোগের জন্য ব্যবহৃত হতে দেয়।
SO_REUSEADDR
সেট করে Address পুনরায় ব্যবহার করা যায়।#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#define PORT 8080
int main() {
int server_fd;
struct sockaddr_in server_addr;
// Server socket তৈরি করা
server_fd = socket(AF_INET, SOCK_STREAM, 0);
if (server_fd < 0) {
perror("Socket creation failed");
exit(EXIT_FAILURE);
}
// SO_REUSEADDR অপশন সেট করা
int opt = 1;
if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0) {
perror("setsockopt failed");
close(server_fd);
exit(EXIT_FAILURE);
}
// Server address সেটআপ করা
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(PORT);
// Binding করা
if (bind(server_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
perror("Bind failed");
close(server_fd);
exit(EXIT_FAILURE);
}
printf("Server is running with SO_REUSEADDR option enabled.\n");
close(server_fd);
return 0;
}
SO_KEEPALIVE
SO_KEEPALIVE
অপশন সক্রিয় করলে TCP সংযোগগুলোর জন্য Keep-alive প্যাকেট পাঠানো হয়, যা সংযোগ জীবিত (alive) রয়েছে কিনা তা যাচাই করতে সহায়ক। এটি দীর্ঘমেয়াদী সংযোগগুলোর ক্ষেত্রে ব্যবহৃত হয়, যেখানে সংযোগ দীর্ঘ সময় ধরে সক্রিয় রাখতে হয়।
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#define PORT 8080
int main() {
int server_fd;
struct sockaddr_in server_addr;
// Server socket তৈরি করা
server_fd = socket(AF_INET, SOCK_STREAM, 0);
if (server_fd < 0) {
perror("Socket creation failed");
exit(EXIT_FAILURE);
}
// SO_KEEPALIVE অপশন সেট করা
int opt = 1;
if (setsockopt(server_fd, SOL_SOCKET, SO_KEEPALIVE, &opt, sizeof(opt)) < 0) {
perror("setsockopt failed");
close(server_fd);
exit(EXIT_FAILURE);
}
// Server address সেটআপ করা
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(PORT);
// Binding করা
if (bind(server_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
perror("Bind failed");
close(server_fd);
exit(EXIT_FAILURE);
}
printf("Server is running with SO_KEEPALIVE option enabled.\n");
close(server_fd);
return 0;
}
SO_LINGER
SO_LINGER
অপশন ব্যবহার করে Socket বন্ধ করার সময় কিভাবে আচরণ করবে তা নির্ধারণ করা যায়। এটি Linger (অপেক্ষার) সময় নির্ধারণ করে, অর্থাৎ Socket বন্ধ হওয়ার সময় কতক্ষণ অপেক্ষা করবে, যাতে সব ডেটা সঠিকভাবে পাঠানো যায়।
0
করা হয়, তবে ডেটা পেন্ডিং থাকলেও Socket অবিলম্বে বন্ধ হয়ে যায়।#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#define PORT 8080
int main() {
int server_fd;
struct sockaddr_in server_addr;
// Server socket তৈরি করা
server_fd = socket(AF_INET, SOCK_STREAM, 0);
if (server_fd < 0) {
perror("Socket creation failed");
exit(EXIT_FAILURE);
}
// SO_LINGER অপশন সেট করা
struct linger linger_opt;
linger_opt.l_onoff = 1; // Linger সক্রিয় করা
linger_opt.l_linger = 10; // 10 সেকেন্ড পর্যন্ত অপেক্ষা
if (setsockopt(server_fd, SOL_SOCKET, SO_LINGER, &linger_opt, sizeof(linger_opt)) < 0) {
perror("setsockopt failed");
close(server_fd);
exit(EXIT_FAILURE);
}
// Server address সেটআপ করা
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(PORT);
// Binding করা
if (bind(server_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
perror("Bind failed");
close(server_fd);
exit(EXIT_FAILURE);
}
printf("Server is running with SO_LINGER option enabled.\n");
close(server_fd);
return 0;
}
common.read_more